package main

import (
	"fmt"
)

func main() {

	// 切片的定义
	// 语法：var 关键字 变量名 []类型
	// 特性：切片是引用类型，声明后，其内存地址不变，但是其内容可以改变，长度不属于类型的一部分
	// 切片的声明
	var a []string
	fmt.Printf("a: %T %v\n", a, a)
	// 在golang中，nil 是空指针，不指向任何的内存地址
	fmt.Println(a == nil)

	var b = []string{}
	fmt.Println(len(b))
	// 赋值错误的，因为切片的长度是0
	//b[0] = "zhangsan"
	//fmt.Println(len(b))
	// 追加元素
	b = append(b, "zhangsan")
	fmt.Println(len(b))
	var c = make([]int, 3, 5)
	fmt.Printf("c: %T %v\n", c, c)
	fmt.Println(c, len(c), cap(c))
	// 容量是什么？
	// 切片指向底层数组的第一个元素到最后一个元素的长度
	c = append(c, 1)
	fmt.Println(c, len(c), cap(c))
	x := [8]int{0, 1, 2, 3, 4, 5, 6, 7}
	y := x[:5]
	fmt.Println(y, len(y), cap(y))
	z := x[3:6]
	fmt.Println(z, len(z), cap(z))
	q := z[0:5] // 截取的是z切片的底层数组
	fmt.Println(q, len(q), cap(q))

	// https://blog.csdn.net/m0_38004619/article/details/98962337

	// 什么是引用类型：切片
	var slice = []int{1, 2, 3, 4, 5}
	slice2 := slice
	slice[0] = 50
	fmt.Println(slice, slice2)
	fmt.Printf("%p %p\n", slice, slice2)

	// 什么是值类型：数组
	var arr = [5]int{1, 2, 3}
	arr4 := arr
	arr[0] = 100
	fmt.Println(arr, arr4)
	fmt.Printf("%p %p\n", &arr, &arr4)
}
